/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logowanie;

import bazy.HibernateUtil;
import bazy.Uzytkownicy;
import dodatki.SHA;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.inject.Named;
import org.hibernate.Query;
import org.hibernate.Session;
//

/**
 * Komponent zarządzajacy do obsługi logowania się użytkowników do systemu.
 * @author Grzesiek
 */
@Named(value = "logBean")
@SessionScoped
public class LogBean implements Serializable {

    Session session = null;
    private String login;
    private String haslo;
    private int id_uz;
    private String imie;
    private String nazwisko;
    private String jednostka;
    private String uprawnienia;
    private String komunikat = "";
    private boolean loggedin = false;
    private boolean error = true;
    private String action;
    String akcja;

    public String getImie() {
        return imie;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public String getAkcja() {
        return akcja;
    }

    public void setAkcja(String akcja) {
        this.akcja = akcja;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public String getJednostka() {
        return jednostka;
    }

    public void setJednostka(String jednostka) {
        this.jednostka = jednostka;
    }

    public String getNazwisko() {
        return nazwisko;
    }

    public void setNazwisko(String nazwisko) {
        this.nazwisko = nazwisko;
    }

    /** Creates a new instance of LoginBean */
    public LogBean() {
    }

    public int getId_uz() {
        return id_uz;
    }

    public void setId_uz(int id_uz) {
        this.id_uz = id_uz;
    }

    public String getHaslo() {
        return haslo;
    }

    public void setHaslo(String haslo) {
        this.haslo = haslo;
    }

    public boolean isLoggedin() {
        return loggedin;
    }

    public void setLoggedin(boolean loggedin) {
        this.loggedin = loggedin;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getKomunikat() {
        return komunikat;
    }

    public void setKomunikat(String komunikat) {
        this.komunikat = komunikat;
    }

    public String getUprawnienia() {
        return uprawnienia;
    }

    public void setUprawnienia(String uprawnienia) {
        this.uprawnienia = uprawnienia;
    }

    /**
     * Sprawdzenie uprawnień do bloku stron admina.
     * @param event
     */
    public void sprawdz_uprawnienia_admin(ComponentSystemEvent event) {
        if (!loggedin || !uprawnienia.equals("admin")) {
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
            handler.performNavigation("brak_dostepu");
        }
    }

    /**
     * Sprawdzenie uprawnień do bloku stron petenta.
     * @param event
     */
    public void sprawdz_uprawnienia_petent(ComponentSystemEvent event) {
        if (!loggedin || !uprawnienia.equals("petent")) {
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
            handler.performNavigation("brak_dostepu");
        }
    }

    /**
     * Sprawdzenie uprawnień do bloku stron finansowego.
     * @param event
     */
    public void sprawdz_uprawnienia_finansowy(ComponentSystemEvent event) {
        if (!loggedin || !uprawnienia.equals("finansowy")) {
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
            handler.performNavigation("brak_dostepu");
        }
    }

    /**
     * Sprawdzenie uprawnień do bloku stron zaopatrzeniowca.
     * @param event
     */
    public void sprawdz_uprawnienia_zaopatrzeniowiec(ComponentSystemEvent event) {
        if (!loggedin || !uprawnienia.equals("zaopatrzeniowiec")) {
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
            handler.performNavigation("brak_dostepu");
        }
    }

    /**
     * Sprawdzenie przy inicjalizacji czy został wprowadzony parametr informujący o wylogowaniu się z systemu.
     */
    public void inicjalizuj() {

        if (akcja != null) {
            if (akcja.equals("logout")) {
                wyloguj();

            }
        }
        akcja = null;
    }

    /**
     * Logowanie do systemu danymi podanymi w formularzu, w przypadku jakichkolwiek błedów wyświetlenie ich w postaci komunikatu.
     * @return nazwa akcji nawigacji która spowoduje wyświetlenie odpowiedniej strony
     */
    public String loguj() {
        this.session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Query query = session.createQuery("from Uzytkownicy u where u.login like '" + login + "'");
        query.setMaxResults(1);
        Uzytkownicy pom_uz = (Uzytkownicy) query.uniqueResult();
        if (pom_uz == null) {
            session.getTransaction().commit();
            session.close();
            komunikat = "Nie ma uzytkownika o takiej nazwie";
            return "brak";
        }
        login = pom_uz.getLogin();
        uprawnienia = pom_uz.getUprawnienia().getNazwaUprawnienia();
        id_uz = pom_uz.getIduzytkownicy();
        imie = pom_uz.getImie();
        nazwisko = pom_uz.getNazwisko();
        jednostka = pom_uz.getJednostka();
        String zakodowane_haslo = SHA.zakoduj(haslo);
        if (!zakodowane_haslo.equals(pom_uz.getHaslo())) {
            komunikat = "Podano błędne hasło";
            session.getTransaction().commit();
            session.close();
            return "brak";
        }
        komunikat = "";
        loggedin = true;
        session.getTransaction().commit();
        session.close();
        if (uprawnienia.equals("admin")) {
            return "admin";
        } else if (uprawnienia.equals("petent")) {
            return "petent";
        } else if (uprawnienia.equals("finansowy")) {
            return "finansowy";
        } else if (uprawnienia.equals("zaopatrzeniowiec")) {
            return "zaopatrzeniowiec";
        }
        return "brak_dostepu";
    }

    /**
     * Rozróżnienie czy jest to komunikat błędu czy informacyjny.
     * @return nazwa klasy CSS.
     */
    public String rodzajKomunikatu() {
        if (error) {
            return "error";
        }
        error = true;
        return "true";
    }

    /**
     * Wylogowanie się z systemu.
     */
    public void wyloguj() {
        error = false;
        loggedin = false;
        komunikat = "Poprawne wylogowanie z systemu";
        System.out.println("Wylogowanie" + loggedin);
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    }
}
